import { DemoGoodsEntity } from './../entity/goods';
import { Provide } from '@midwayjs/decorator';
import { BaseService } from '@cool-midway/core';
import { InjectEntityModel } from '@midwayjs/typeorm';
import { Repository } from 'typeorm';
import * as md5 from 'md5';

/**
 * 商品示例
 */
@Provide()
export class DemoGoodsService extends BaseService {
  // @InjectEntityModel(XxxEntity)
  // xxxEntity: Repository<XxxEntity>;
  @InjectEntityModel(DemoGoodsEntity)
  demoGoodsEntity: Repository<DemoGoodsEntity>;

  /**
   * 执行sql分页查询
   */
  async sqlPage(query) {
    await this.demoGoodsEntity.save({
      id: 11,
      title: '标题',
      price: 99.0,
      description: '商品描述',
      mainImage: 'https://cool-js.com/logo.png',
    });
    await this.demoGoodsEntity.delete({ id: 11 });
    return this.sqlRenderPage(
      'select * from demo_goods ORDER BY id ASC',
      query,
      false
    );
  }

  /**
   * 执行entity分页（非sql分页查询）
   */
  async entityPage(query) {
    const find = this.demoGoodsEntity.createQueryBuilder();
    // find.where("id = :id", { id: 1 });
    return this.entityRenderPage(find, query);
  }

  /**
   * 执行sql
   * SQL 动态条件。分页查询和普通的 SQL 查询都支持动态条件，通过this.setSql(条件,sql语句,参数)来配置
   */
  async sql(query) {
    return this.nativeQuery(`
    select * from demo_goods a
      WHERE 1=1
      ${this.setSql(query.id, 'and a.id = ?', [query.id])}
    ORDER BY id ASC
    `);
  }

  /**
   * 修改之前
   * 有时候我们需要在数据进行修改动作之前，对它进行一些处理，比如：修改密码时，需要对密码进行加密，这时候我们可以使用modifyBefore方法来实现
   * @param data
   * @param type
   */
  async modifyBefore(data: any, type: 'delete' | 'update' | 'add') {
    if (type == 'update') {
      data.password = md5(data.password);
    }
  }

  /**
   * 修改之后
   * 有时候我们需要在数据进行修改动作之后，对它进行一些处理，比如：修改完数据之后将它放入队列或者 ElasticSearch
   * @param data
   * @param type
   */
  async modifyAfter(data: any, type: 'delete' | 'update' | 'add') {
    // 你想做的其他事情
  }
}
